
<html>
        <head></head>
        <body>
            <p>new一个对象过程</p>
    
            <script>
                // 构造函数 首字母大写
                function Person(name, age) {
                    // var this = new Object(); 系统偷偷替咱做
                    this.name = name;
                    this.age = age;
                    this.sayName = function() { alert(this.name) };
                    // return this;  系统偷偷替咱做 
                    return function(){}
                }
                var person1 = new Person("BurC", 21);

                // 模拟实现一个自己的new构造器
                function objectFactory(){
                    // arguments不是真正的数组，不支持shift,但可以从支持shift方法的Array对象上“借用”shift方法
                    // shift会改变原数组，并返回被删除元素
                    fn = Array.prototype.shift.apply(arguments)
                    
                    var obj = Object.create(fn.prototype)

                    // 必须用apply 不能用call 因为apply仅传递两个参数，一个this指向，一个是所有参数的数组
                    var ret = fn.apply(obj,arguments)
                    
                    // 判断返回的值是不是一个对象【数组、对象、函数】，如果是一个对象，我们就返回这个对象，如果没有，我们该返回什么就返回什么
                    if(ret instanceof Object){
                        return ret
                    }else{
                        return obj
                    }
                }

                var person2 = objectFactory(Person,"BurCha", 22) // Person为你想要传入的构造函数
                
                console.log(person1)
                console.log(person2)
            </script>
        </body>
    </html>